﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace DomainClasses
{
	public class Alias
	{
		public Alias()
		{
			PrivacySettings = new Privacy();
		}

		public int AuthorKey
		{
			get;
			set;
		}

		public string Name
		{
			get;
			set;
		}

		public string UserName
		{
			get;
			set;
		}

		public string Email
		{
			get;
			set;
		}

		public string Bio
		{
			get;
			set;
		}

		public DateTime? CreateData
		{
			get;
			set;
		}

		//public byte[] Avatar
		//{
		//   get;
		//   set;
		//}

		public virtual TwitterAvatar Avatar // Marcar como virtual faz com que possamos trabalhar com LazyLoad
		{
			get;
			set;
		}

		public ICollection<Tweet> Tweets
		{
			get;
			set;
		}

		public byte[] RowVersion
		{
			get;
			set;
		}

		public string AliasPlusName
		{
			get
			{
				return Name + "(" + UserName + ")";
			}
		}

		public Privacy PrivacySettings
		{
			get;
			set;
		}
	}

	public class TwitterAvatar
	{
		public int AuthorKey
		{
			get;
			set;
		}

		public byte[] Avatar
		{
			get;
			set;
		}
	}
	
	public class Tweet
	{
		public int Id
		{
			get;
			set;
		}

		public DateTime CreateDate
		{
			get;
			set;
		}

		public string Content
		{
			get;
			set;
		}

		public Alias Author
		{
			get;
			set;
		}

		public int AuthorId // Essa é a FK que eu desejo no Banco.
		{
			get;
			set;
		}
	}

	public class LongTweet : Tweet // Criando essa herança, será adicionado a tabela Tweet as colunas que forem criadas como propriedades dessa classe.
	{
		public string ExtraContent
		{
			get;
			set;
		}
	}

	public class Privacy
	{
		// --> Comentando a PK para que a entidade seja encarada como um Complex Type
		// Quando temos um tipo complexo todas as propriedades são associadas a Tabela da Entidade que possui o relacionamento com a mesma.
		public int PrivacyId
		{
			get;
			set;
		}

		public bool TweetsArePrivate
		{
			get;
			set;
		}

		public bool AddLocationToTweets
		{
			get;
			set;
		}

		public bool HttpsRequired
		{
			get;
			set;
		}
	}

	public class Person
	{
		public int Id
		{
			get;
			set;
		}

		public string Name
		{
			get;
			set;
		}

		#region FK's
		/*
			Essas duas propriedades serão reconhecidas como FKs no Banco.
		 */
		public Alias AliasAdministration
		{
			get;
			set;
		}

		public Alias AliasGuestAuthor
		{
			get;
			set;
		}

		#endregion
	}
}
